<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>

    /* 
- 变量到底是什么?
  - 可以变化的量, 由变量名和变量值组成, 名称是标识, 值是可以变化的
  - 一个变量对应一块小内存, 变量名是这块内存的标识名称, 用于查找这块内存, 变量的值就是内存中保存的数据
- 基本类型变量与引用类型变量的区别是什么?
  - 根据变量内存中保存的数据来区分
  - 基本类型变量: 内存中保存的基本类型的数据
  - 引用类型变量: 内存中保存的是地址值
- 给变量赋值到底做了什么?
  - 将基本类型数据赋给变量: 将数据保存在变量内存中
  - 将对象赋给变量: 将对象在内存中的地址值保存在变量内存中
  - 将另一个变量赋给变量: 将右侧变量内存中的数据(基本数据/地址值数据)拷贝保存到左侧变量内存
- 函数传参, 到底是值传递还是引用传递? 
  - 函数调用时, 是将实参变量的数据拷贝一份赋值给形参变量
  - 只是实参变量数据可能是基本类型, 也可能是引用类型的(地址值)
- 有哪些改变变量值的方式?
  - 只能通过赋值改变
  - c.m = 2: 改的是c变量指向的对象内部的属性数据, c本身没有变化的(对象内存的位置没变)
- 如何理解下面2句重要的话(编码演示说明)?
  - 2个引用变量指向同一个对象, 如果通过一个变量修改对象内部的数据 => 另一个变量也能看到原对象(新数据)
  - 2个引用变量指向同一个对象, 让其中一个变量指向一个新的对象 => 另一个引用变量看到的是老的对象
     */

    // var a = 3
    // console.log(a)
    // a = 4

    // var a = 'abc'
    // var b = {m: 1}
    // var c = a
    // c = b   // ?  将b内存的地址值保存到c内存中?  不对   将b内存保存的地址值保存到c内存中
    // 无论你将什么类型的变量赋值给另一个变量, 都是拷贝右边变量内存中的数据保存到左边变量内存中

    // 函数传参, 到底是值传递还是引用传递? 
    // function fn(x) {
      
    // }
    // fn(a) // x = a  // 值传递
    // fn(b) // x = b   // 值? 引入?

    // 有哪些改变变量值的方式?
    // var d = {m: 1}
    // var e = 123
    // d = 3
    // d = {}
    // d.m = 2 // 有没有改变变量d?

    // 一个对象不可能在另一个对象内部  ?   每个对象都是独立的内存, 对象之前是通过引用关联起来的
    // var f = {
    //   x: 3,
    //   m: {
    //     a: 2
    //   }
    // }
    // f.n = [1, 2]


    /* 
    如何理解下面2句重要的话(编码演示说明)?
  - 2个引用变量指向同一个对象, 如果通过一个变量修改对象内部的数据 => 另一个变量也能看到原对象(新数据)
  - 2个引用变量指向同一个对象, 让其中一个变量指向一个新的对象 => 另一个引用变量看到的是老的对象
    */
    var a = {m: 1}
    var b = a
    // b.m = 2
    // console.log(a.m) // 2

    // a = {m: 2}
    // console.log(b.m) // ?

    function fn(a) {
      // a = {m: 2}
      a.m = 3
    }
    fn(a)
    console.log(a.m, b.m) // ? ?


  </script>
</body>
</html>